/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.ABMMaquinaria;

import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.Maquinaria;
import estructurassa.expertos.ExpertoABMMaquinaria;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMMaquinariaException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import persistencia.Conexion;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ControladorABMMaquinaria implements Controlador {

    PantallaABMMaquinarias pantalla;
    PantallaMaquinariasJDialog pantallaMaquinariaJDialog = new PantallaMaquinariasJDialog(null, true);
    ExpertoABMMaquinaria experto;
    Maquinaria maquinaria;
    ModeloTablaMaquinaria modeloTablaMaquinaria = new ModeloTablaMaquinaria();
    private boolean iniciado = false;

    public ControladorABMMaquinaria() {
        pantalla = new PantallaABMMaquinarias();
        experto = (ExpertoABMMaquinaria) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_MAQUINARIA);

        agregarListenerABotones();
        agregarListenersABotonesJDialog();

    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        } else {
            pantalla.setVisible(true);
        }
        pantalla.getTablaMaquinarias().setModel(modeloTablaMaquinaria);
        ((ModeloTablaMaquinaria) pantalla.getTablaMaquinarias().getModel()).setListaElementos(experto.buscarMaquinarias());

    }

    public void agregarListenerABotones() {
        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantalla.setVisible(false);
            }
        });
        pantalla.getBtnDarDeBaja().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                DarDeBaja();
            }
        });
        pantalla.getBtnModificar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                modificar();
            }
        });
        pantalla.getBtnNuevo().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                nuevo();
            }
        });

        pantalla.getTablaMaquinarias().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarMaquinaria();
            }
        });

    }

    public void seleccionarMaquinaria() {
        int fila = pantalla.getTablaMaquinarias().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTablaMaquinarias().convertRowIndexToModel(fila);
        maquinaria = (Maquinaria) ((ModeloTablaMaquinaria) pantalla.getTablaMaquinarias().getModel()).getRow(filaModelo);

    }

    public void agregarListenersABotonesJDialog() {
        pantallaMaquinariaJDialog.getBtnGuardar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                guardar();
            }
        });
        pantallaMaquinariaJDialog.getBtnSalirJDialog().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantallaMaquinariaJDialog.setVisible(false);
            }
        });
    }

    public void limpiarPantallaJDialog() {
        pantallaMaquinariaJDialog.getTextoConsumo().setText("");
        pantallaMaquinariaJDialog.getTextoDescripcion().setText("");
        pantallaMaquinariaJDialog.getTextoNombre().setText("");
        pantallaMaquinariaJDialog.getTextoUnidadConsumo().setText("");

    }

    public void nuevo() {
        maquinaria = null;
        limpiarPantallaJDialog();
        pantallaMaquinariaJDialog.setVisible(true);
    }

    public void modificar() {
        if (maquinaria != null) {
            pantallaMaquinariaJDialog.getTextoConsumo().setText(maquinaria.getConsumo() + "");
            pantallaMaquinariaJDialog.getTextoDescripcion().setText(maquinaria.getDescripcion());
            pantallaMaquinariaJDialog.getTextoNombre().setText(maquinaria.getNombre());
            pantallaMaquinariaJDialog.getTextoUnidadConsumo().setText(maquinaria.getUnidadConsumo());
            pantallaMaquinariaJDialog.setVisible(true);
        } else {
            JOptionPane.showMessageDialog(null, "Seleccione maquinaria a modificar");
        }
    }

    public void DarDeBaja() {
        if (maquinaria == null) {
            return;
        }
        int confirmado = JOptionPane.showConfirmDialog(
                pantalla,
                "¿Desea dar baja la maquinaria: " + maquinaria.getNombre() + "?");
        if (JOptionPane.OK_OPTION == confirmado) {
            try {
                experto.darDeBaja(maquinaria);
            } catch (ABMMaquinariaException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                return;
            } catch (ExcepcionFachada ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }
            JOptionPane.showMessageDialog(pantalla, "La maquinaria seleccionada fue dada de baja correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            ((ModeloTablaMaquinaria) pantalla.getTablaMaquinarias().getModel()).removeElement(maquinaria);
            limpiarPantallaJDialog();
            maquinaria = null;
        }
    }

    public void guardar() {
        if (pantallaMaquinariaJDialog.getTextoNombre().getText().length() != 0
                && pantallaMaquinariaJDialog.getTextoUnidadConsumo().getText().length() != 0
                && pantallaMaquinariaJDialog.getTextoPrecioHoraConsumo().getText().length() != 0
                && pantallaMaquinariaJDialog.getTextoConsumo().getText().length() != 0) {
            boolean nuevo = false;
            if (maquinaria == null) {
                maquinaria = new Maquinaria();
                nuevo = true;
            }
            maquinaria.setConsumo(Float.parseFloat(pantallaMaquinariaJDialog.getTextoConsumo().getText()));
            maquinaria.setDescripcion(pantallaMaquinariaJDialog.getTextoDescripcion().getText());
            maquinaria.setNombre(pantallaMaquinariaJDialog.getTextoNombre().getText());
            maquinaria.setUnidadConsumo(pantallaMaquinariaJDialog.getTextoUnidadConsumo().getText());
            maquinaria.setPrecioConsumoHora(Float.parseFloat(pantallaMaquinariaJDialog.getTextoPrecioHoraConsumo().getText()));
            try {

                experto.guardar(maquinaria);

            } catch (ABMMaquinariaException ex) {
                Conexion.getInstancia().deshacerTx();
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;

            }
            if (nuevo) {
                modeloTablaMaquinaria.addRow(maquinaria);
            } else {
                modeloTablaMaquinaria.setListaElementos(experto.buscarMaquinarias());
            }

        } else {
            JOptionPane.showMessageDialog(pantalla, "Faltan completar datos", "ERROR", JOptionPane.ERROR_MESSAGE);

        }
    }
}
